package com.atguigu.keyword;

import java.util.Objects;

public class Student {
    //实例变量，私有化
    private String name;
    private int score;

    //无参构造，有参构造
    public Student() {
    }

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
    //get/set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
    //重写toString等

    @Override
    public String toString() {
        return "Student{" +
                "score=" + score +
                ", name='" + name + '\'' +
                '}';
    }

    //重写hashCode方法的快捷键 (1)Ctrl+O (2)Alt+Insert(推荐）
    @Override
    public boolean equals(Object o) {//形参是Object类型，但是实际上，实参应该是Student等对象
        /*
        测试类中 s1.equals(s2)
        this是当前对象，表示调用equals方法的对象。针对上面这句代码，this是s1
        o是()中接收的实参对象。。针对上面这句代码，o是s2
         */
        if (this == o) return true; //如果this==o，等价于 s1==s2，它们的地址相同

        if (o == null || getClass() != o.getClass()) return false;
        /*
        如果 o == null ，就直接返回false。因为如果能进入到这个方法中，说明s1一定不是null，如果s1是null，就发生空指针异常NullPointerException。
                        既然s1不为null，o为null，肯定不相等。

        如果getClass() != o.getClass() ，就直接返回false。
                getClass() 它其实是 this.getClass() 表示的是返回this对象的类型，即s1对象的类型
                o.getClass() 它就是返回o对象的类型，即s2对象的类型
                如果两个对象的类型不同，那么就是false
         */

        Student student = (Student) o; //强制转换
        return score == student.score && Objects.equals(name, student.name);
        //     this.score == student.score 且  Objects.equals(this.name, student.name)（比较的是名字）
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, score);
    }
}
